package com.css.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class MD5Utils {
    /**
     * 计算字符串的 MD5 哈希值（十六进制表示）。
     *
     * @param input 要计算哈希值的字符串。
     * @return MD5 哈希值的十六进制字符串表示，如果发生异常则返回 null。
     */
    public static String md5Hex(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            System.err.println("MD5 algorithm not available: " + e.getMessage());
            return null;
        }
    }

    /**
     * 计算字符串的 MD5 哈希值（Base64 编码）。
     *
     * @param input 要计算哈希值的字符串。
     * @return MD5 哈希值的 Base64 编码字符串，如果发生异常则返回 null。
     */
    public static String md5Base64(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(digest);
        } catch (NoSuchAlgorithmException e) {
            System.err.println("MD5 algorithm not available: " + e.getMessage());
            return null;
        }
    }

    public static void main(String[] args) {
        String text = "123456";
        String md5HexResult = md5Hex(text);
        String md5Base64Result = md5Base64(text);

        System.out.println("Original text: " + text);
        System.out.println("MD5 (Hex): " + md5HexResult);
        System.out.println("MD5 (Base64): " + md5Base64Result);

        String anotherText = "Another string to hash.";
        System.out.println("Original text: " + anotherText);
        System.out.println("MD5 (Hex): " + md5Hex(anotherText));
        System.out.println("MD5 (Base64): " + md5Base64(anotherText));
    }
}
